package com.waitingresult.thread.demo;

public class ThreadDemo1 {
    /**
     * 老生常谈的并发线程安全问题
     * 为什么会出现数据安全问题
     * 1. 是否存在多线程环境
     * 2. 是否存在共享数据
     * 3. 是否有多条语句, 操作共享数据
     * 解决方式
     *  使用 synchronized 锁机制 做强制同步代码块
     *  也可以使用Lock锁,
     */

    public static void main(String[] args) {
        Thread1 thread1 = new Thread1();
        new Thread(thread1, "窗口1").start();
        new Thread(thread1, "窗口2").start();
        new Thread(thread1, "窗口3").start();
        new Thread(thread1, "窗口4").start();
        new Thread(thread1, "窗口5").start();
        new Thread(thread1, "窗口6").start();
    }
}

class Thread1 implements Runnable {
    private  int tickets = 100;

    @Override
    public void run() {
        while (true) {
           synchronized (Thread1.class){
               if (tickets > 0) {
                   try {
                       Thread.sleep(100);
                   } catch (InterruptedException e) {
                       e.printStackTrace();
                   }
                   System.out.println(Thread.currentThread().getName() + "窗口卖票:" + tickets);
                   tickets--;
               }
           }
        }

    }
}
